String是屬於一個不可變immutable
類型,在Java中有經過特別的處理。
在Java的String物件存放在Heap(堆)
中,但是為了優化記憶體和儲存空間,所以Java使用了字串池String Pool
的方式儲存字串。
💡字串池String Pool
一樣是放在Heap
中,只是有一個獨立的空間存放,之前在Day12-類(記憶體中的表現方式)中的圖片有提過沒那麼正確。
String s1 = "hello";
String s2 = "hello";
當使用這樣的方式去創造一個String
時,會在String Pool
中建立一個hello
的物件,並且將這個物件的位址返回給s1
和s2
。
String s3 = new String("hello");
當使用String
的構造器創建時,這時候的s3
指向的會是一個存放在Heap
中的物件位址,這個物件會有一個value
的屬性
,並且value
的屬性會指向String Pool
中存放hello
的物件位址。
s1 == s2 // true
s1 == s3 // false
JDK9以前String
是使用char[]
進行value
的儲存。
JDK9以後String
是使用byte[]
進行value
的儲存(會根據使用的字符編碼判斷要儲存單字節或是雙字節)。
在記憶體中應該要是長這個樣子,會在String Pool
中創建一個byte[]
存放String
,並且有一個指針指向這個物件。
使用+
連接字串
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = "hello" + "world";
String s5 = s1 + "world";
String s6 = "hello" + s2;
String s7 = s1 + s2;
s3 == s4 // true
s3 == s5 // false
s3 == s6 // false
s3 == s7 // false
s4
是兩個常量
,所以在底層中會直接將兩個常量合併後,再指向String Pool
中的位址。變數
+ 常量
,或是兩個變數相加
,String
底層是會使用StringBuilder
中的toString()
方法,而這個方法中是使用new String()
構造器的方式去新增的,所以會在Heap
中先創建一個物件
,物件中會有一個value
的屬性指向String Pool
中的helloworld
。